package com.yhn.schedule;

import com.xxl.job.core.handler.annotation.XxlJob;
import com.yhn.service.SectionStatsService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class SectionStatsSchedule {
    @Autowired
    private SectionStatsService sectionStatsService;

    /**
     * 每日板块统计计算任务
     * 在 XXL-JOB 管理后台配置 cron: 0 0 2 * * ?
     */
    @XxlJob("calculateDailyStats")
    public void calculateDailyStats() {
        log.info("开始执行每日板块统计计算任务");
        try {
            sectionStatsService.calculateAllSectionsStats();
            log.info("每日板块统计计算任务执行完成");
        } catch (Exception e) {
            log.error("每日板块统计计算任务执行失败", e);
            throw e; // 重新抛出异常，让 XXL-JOB 知道任务执行失败
        }
    }

    /**
     * 每月板块统计计算任务
     * 在 XXL-JOB 管理后台配置 cron: 0 0 3 1 * ?
     */
    @XxlJob("calculateMonthlyStats")
    public void calculateMonthlyStats() {
        log.info("开始执行每月板块统计计算任务");
        try {
            sectionStatsService.calculateAllSectionsStats();
            log.info("每月板块统计计算任务执行完成");
        } catch (Exception e) {
            log.error("每月板块统计计算任务执行失败", e);
            throw e; // 重新抛出异常，让 XXL-JOB 知道任务执行失败
        }
    }

    /**
     * 手动触发统计计算任务
     * 可以通过 XXL-JOB 管理后台手动触发
     */
    @XxlJob("manualCalculateStats")
    public void manualCalculateStats() {
        log.info("开始执行手动板块统计计算任务");
        try {
            sectionStatsService.calculateAllSectionsStats();
            log.info("手动板块统计计算任务执行完成");
        } catch (Exception e) {
            log.error("手动板块统计计算任务执行失败", e);
            throw e; // 重新抛出异常，让 XXL-JOB 知道任务执行失败
        }
    }

    /**
     * 单个板块统计计算任务
     * 可以通过 XXL-JOB 管理后台传递参数来指定板块ID
     */
    @XxlJob("calculateSingleSectionStats")
    public void calculateSingleSectionStats(String param) {
        log.info("开始执行单个板块统计计算任务，参数: {}", param);
        try {
            Long sectionId = Long.parseLong(param);
            sectionStatsService.calculateSectionStats(sectionId);
            log.info("单个板块统计计算任务执行完成，板块ID: {}", sectionId);
        } catch (NumberFormatException e) {
            log.error("参数格式错误，应为数字: {}", param, e);
            throw new IllegalArgumentException("参数格式错误，应为数字: " + param);
        } catch (Exception e) {
            log.error("单个板块统计计算任务执行失败，参数: {}", param, e);
            throw e;
        }
    }
}
